﻿using System;
using System.Collections.Generic;
using System.Reflection;

namespace Tizer.Core.Helpers
{
    /// <summary>
    /// Класс расширения enum
    /// </summary>
    public class EnumMetadataConverter
    {
        /// <summary>
        /// Получить значения атрибутов из метаданных
        /// </summary>
        /// <param name="enumType">Enum у которого получить</param>
        /// <returns>Перечисление значения атрибутов</returns>
        public static Dictionary<int, string> GetListItems(Type enumType)
        {
            if (!enumType.IsEnum)
                throw new ApplicationException("GetListItems не поддерживает не-enum типы");
            Dictionary<int, string> list = new Dictionary<int, string>();
            foreach (FieldInfo field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))
            {
                int value;
                string display;
                value = (int)field.GetValue(null);
                display = Enum.GetName(enumType, value);
                foreach (Attribute currAttr in field.GetCustomAttributes(true))
                {
                    EnumValueDataAttribute valueAttribute = currAttr as EnumValueDataAttribute;
                    if (valueAttribute != null)
                        display = valueAttribute.Name;
                }
                list.Add(value, display);
            }
            return list;
        }

        /// <summary>
        /// Получение значения атрибута конкретного (указанного) элемента enum
        /// </summary>
        /// <param name="value">Элемент enum</param>
        /// <example>string value = UserRoleEnum.Administrator.GetStringValue();</example>
        /// <returns>Значение атрибута</returns>
        public static string GetStringValue(Enum value)
        {
            Type type = value.GetType();
            FieldInfo fieldInfo = type.GetField(value.ToString());
            EnumValueDataAttribute[] attribs = fieldInfo.GetCustomAttributes(
                    typeof(EnumValueDataAttribute), false) as EnumValueDataAttribute[];
            return attribs.Length > 0 ? attribs[0].Name : null;
        }

        /// <summary>
        /// Возвращает элемент enum по индексу
        /// </summary>
        /// <typeparam name="T">Перечисление</typeparam>
        /// <param name="number">Индекс</param>
        /// <example>DaysOfWeek d  = NumToEnum<DaysOfWeek>(int day = 5);</example>
        /// <returns></returns>
        public static T NumToEnum<T>(int number)
        {
            return (T)Enum.ToObject(typeof(T), number);
        }
    }
}
